package com.cm.creational.singleton;

/**
 * 饿汉式
 * <p>
 * 通俗的来讲，这位打工人对干饭特积极，不管饿不饿都跟饿死鬼似的，老早的就把干饭工具准备好了( new 对象)，随时准备干饭。
 * 实现方式
 * 静态常量方式
 * 优点：这种写法比较简单，就是在类加载的时候就完成实例化。避免了线程同步问题。
 * <p>
 * 缺点：在类加载的时候就完成实例化，没有达到Lazy Loading的效果。如果从未使用过这个实例，则会造成内存的浪费。
 *
 * @author gcm
 * @date 2024/1/30 14:08
 */
public class SingletonStaticHungry {
    /**
     * 饿汉式：静态常量1
     * 静态常量方式
     * 优点：这种写法比较简单，就是在类加载的时候就完成实例化。避免了线程同步问题。
     *
     * 缺点：在类加载的时候就完成实例化，没有达到Lazy Loading的效果。如果从未使用过这个实例，则会造成内存的浪费。
     */
    public static final SingletonStaticHungry SINGLE_TON = new SingletonStaticHungry();

    private SingletonStaticHungry() {

    }

    /**
     * 饿汉式：静态常量2
     */
    private static final SingletonStaticHungry SINGLE_TON_TWO = new SingletonStaticHungry();


    public static SingletonStaticHungry getSingleTon() {
        return SINGLE_TON_TWO;
    }

    /**
     * 饿汉式：静态代码块
     * 将类实例化的过程放在了静态代码块中，也是在类加载的时候，就执行静态代码块中的代码，初始化类的实例。
     */
    private static final SingletonStaticHungry SINGLE_TON_THREE;

    // 在静态代码块执行时，创建单例对象
    static {
        SINGLE_TON_THREE = new SingletonStaticHungry();
    }


    public static SingletonStaticHungry getSingleTonThree() {
        return SINGLE_TON_THREE;
    }

    public static void test(){
        System.out.println("调用饿汉式单例的普通静态方法，此时单例："+SINGLE_TON);
    }
}
